AWS Lambdaのまとめ: 仕組み・動作
効率的で信頼性の高いサーバーレスアプリケーションを開発するためには、AWS Lambdaの仕組みを理解することが重要です。 このブログでは AWS Lambdaの実行までの仕組みと、さまざまな条件での動作をまとめていきます。
はじめに
AWS Lambda は、サーバーをプロビジョニングまたは管理せずにコードを実行できるようにするサーバーレスコンピューティングサービスです。
AWS Lambda を使用すると、インフラストラクチャ管理の重労働を AWS に任せて、コードの作成に集中できます。 AWS Lambda サービスは、必要なときだけ関数を実行し、需要に基づいて自動的にスケーリングします。 消費したコンピュート時間に対してのみ課金されます。コードが実行されていない間は料金は発生しません。
実行までの仕組み
AWS Lambda 関数
- 関数は、Lambda でコードを実行するために呼び出すことができるリソースです。
- 関数には、関数に渡すイベント、もしくは他の AWS のサービスから送信されたイベントを処理するコードが含まれています。
イベントトリガー
- AWS Lambdaは、イベントを処理するために関数のインスタンスを実行します。AWS Lambda関数は、AWS Lambda APIを使って直接呼び出すこともできますし、AWSのサービスやリソースを設定して関数を呼び出すこともできます。
- AWS Lambda 関数は、HTTP リクエスト、データステートの変更、ファイルのアップロードなど、さまざまなイベントによってトリガーされます。
AWS Lambda実行環境
Lambda サービスは、関数の実行環境を準備することから始まる。
- イベントがAWS Lambda関数をトリガーすると、指定されたメモリ、ランタイム、構成設定で関数環境が作成されます。
- AWS Lambda は関数のインスタンスを作成し、選択したランタイム (Nodejs、Python、Java ) に基づいてランタイム環境を初期化します。
- このサービスは関数のコードをダウンロードし、内部のS3バケット(またはコンテナ・パッケージングの場合はAmazon ECR)に格納し、指定されたメモリ、ランタイム、構成(コンフィギュレーション)で環境をセットアップします。
- コード、依存関係、設定をデプロイメントパッケージにパッケージします。
初期化コード
- イベントハンドラのコードを実行する前に、AWS Lambdaはハンドラの外で定義された初期化コードを実行します。このコードには、セットアップタスク、接続、設定などが含まれます。
- この初期化のオーバーヘッドは、関数の実行時間にさらなる待ち時間をもたらす可能性がある。
コードの実行
- 最後に、AWS Lambdaはプロビジョニングされたランタイム環境内でハンドラーコード(関数のコード)を実行します。
- 入力されたイベントデータを処理し、出力を生成します。
- 実行完了後、環境は一定期間 AWS Lambdaによって保持されます。
- AWS Lambda関数が一定期間呼び出されないと、AWS Lambdaはその関数に関連付けられているコンピュートリソースを自動的に割り当て解除します。
まとめると、AWS Lambda 仕組みには、実行環境の準備、コードのダウンロード、環境の作成、初期化コードの実行、そして最後にイベント・ハンドラの実行というプロセスが含まれる。この仕組みでは、特にコールドスタート時に初期化の待ち時間が発生し、関数全体の実行時間に影響を与える可能性があります。
コールドスタート
イベントによって AWS Lambda 関数がトリガーされると、その実行環境を最初から作成する必要がある場合があります。このプロセスは「コールド スタート」として知られています。
- コールドスタートは、関数が初めて呼び出されたとき、または非アクティブやリソースの最適化のためにAWSによって環境が破棄されたときに発生します。
- コールドスタートの間、AWSはリソースをプロビジョニングし、関数コードをダウンロードし、ランタイムを初期化し、ネットワークをセットアップします。
- このプロセスは、関数の実行時間に追加の待ち時間をもたらします。
- コールド スタートの継続時間は、100 ミリ秒未満から 1 秒以上までさまざまです。コールド スタートは通常、運用ワークロードよりも開発およびテスト機能でより一般的です。これは、開発関数とテスト関数は通常、それほど頻繁に呼び出されないためです。
ウォームスタート(後続の呼び出し)
AWS Lambda関数が呼び出され、既存の実行環境が再利用されることをウォームスタートと呼びます。
- 実行完了後、実行環境はフリーズします。
- AWS Lambdaサービスは実行環境を一定期間保持する。この間、同じ関数に対して別のリクエストが来た場合、サービスは既存の環境を再利用することがあります。
- ウォームスタートの間、環境はすでに存在しているので、関数はより迅速に実行を開始することができる。その結果、コールドスタートと比較して待ち時間が短くなります。
連続して関数を実行した場合の挙動
一貫したイベントの流れによって関数が継続的に実行される場合、AWS Lambdaはコンピュートリソースのプロビジョニングとスケーリングをシームレスに管理します。関数の複数のインスタンスを作成して管理し、並列処理と効率的なリソース利用を可能にします。
- 効率的なスケーリング: AWS Lambdaは、イベントの連続的なフローに効率的に対応するためにリソースを管理します。
- パラレルプロセッシング: AWS Lambdaは、パラレルプロセッシングのために関数の複数のインスタンスを作成することで、自動的にスケールアウトします。
- リソース管理: AWS Lambdaは需要に応じてリソースを管理します。
- コンカレンシーの制限: 各関数には、設定可能な最大コンカレンシーの制限があります。関数がスケールできるよりも早くリクエストが到着した場合、またはファンクションが最大容量に達した場合、追加のリクエストはスロットリングエラーで失敗します。
しばらく実行されていない場合の挙動
- リソースの割り当て解除: 関数が一定時間アイドル状態の場合、AWS Lambdaは自動的に計算リソースを割り当て解除します。
- コストの最適化: リソースをゼロにスケールダウンすることで、関数が使用されていないときのコストを最小化します。
- インスタントなスケーラビリティ: 次の呼び出し時に即座にリソースが割り当てられます。
多数の実行がリクエストされた場合の挙動
- 自動スケーリング: AWS Lambda は、リクエストの数が増加すると自動的にスケールアウトします。
- パラレルプロセッシング: 関数の複数のインスタンスが同時にリクエストを処理します。
- 過剰なプロビジョニングは行わない:リソースは動的にプロビジョニングされるため、過剰なプロビジョニングを防ぎ、コストを削減します。
実行までの挙動を踏まえた注意点
AWS Lambdaの利用を最適化するために、開発者はいくつかの注意点を考慮する必要があります:
- 関数のサイズ: 初期化時間を短縮するために、関数デプロイメント パッケージを小さくします。
- メモリの割り当て: リソース要件に基づき、関数に適切なメモリを割り当てます。
- コールドスタート: プロビジョニングされた同時実行を使用するか、関数コードを最適化することによって、コールドスタートの遅延を理解し、緩和します。
- コンカレンシーの制限: コンカレンシーの制限を認識し、高トラフィックシナリオでのスロットリングの可能性を考慮します。
Layerの効果
AWS Lambda レイヤーは、補助的なコードやデータを含む.zipファイルのアーカイブです。AWS Lambda レイヤーには通常、ライブラリーの依存関係、カスタムランタイム、設定ファイルなどが含まれます。
- レイヤーを使用できるのは、.zipファイルのアーカイブとしてデプロイされたAWS Lambda関数だけです。
- AWS Lambda レイヤーは、複数の関数間でコード、ライブラリ、依存関係を管理および共有するメカニズムを提供します。
- コードの再利用が可能で、更新が簡単で、一貫した実行環境が保証されます。
- レイヤーは複数のバージョンを持つことができ、一貫性と容易な管理を保証します。
- 関数にレイヤーを追加すると、AWS Lambdaはレイヤーの内容を関数の実行環境の/optディレクトリに展開します。 これにより、関数はレイヤーの内容にアクセスできるようになります。
- 関数にレイヤーを付けることで、開発者はカスタムコードと共通コンポーネントを分離することができます。これにより、アプリケーションがより管理しやすく、モジュール化されます。
まとめ
このブログでは、AWS Lambdaの概要について、実行までの仕組み、様々な条件下での動作、コールドスタートとウォームスタートの影響、AWS Lambdaレイヤーの意義について説明した。AWS Lambdaの仕組みを理解することで、開発者はAWSクラウドでスケーラブルで応答性が高く、コスト効率の高いアプリケーションを作成できるようになります。